gusucode.com > VC++ 仿QQ2006界面 > VC++ 仿QQ2006界面/gusucode/SkinBtn.cpp
//Download by http://www.NewXing.com /************************************************************************ * 文件名: SkinBtn.cpp * 文件描述: 图片按钮 * 创建人: 黄锐坤(Nuk), 2006年08月22日 * 版本号: 1.0 ************************************************************************/ // SkinBtn.cpp : 实现文件 // #include "stdafx.h" #include "NUK.h" #include "SkinBtn.h" // CSkinBtn IMPLEMENT_DYNAMIC(CSkinBtn, CButton) CSkinBtn::CSkinBtn() { m_state = NORMAL; m_pFont=new CFont(); m_pFont->CreatePointFont(90,_T("Arial")); m_fg = RGB(0, 0, 0); m_bg = RGB(255, 255, 255); m_bMouseOver = false; m_bEnabled = true; m_bDCStored = false; m_textPos = CPoint(21,0); m_iconRect = CRect(0,0,16,16); } CSkinBtn::~CSkinBtn() { delete m_pFont; m_memDC.DeleteDC(); } BEGIN_MESSAGE_MAP(CSkinBtn, CButton) ON_WM_MOUSEMOVE() ON_WM_TIMER() ON_WM_ERASEBKGND() ON_WM_SETCURSOR() ON_WM_ENABLE() END_MESSAGE_MAP() void CSkinBtn::DrawItem(LPDRAWITEMSTRUCT lpDIS) { //// TODO: 添加您的代码以绘制指定项 //CDC* pDC = CDC::FromHandle(lpDIS->hDC); UINT state = lpDIS->itemState; //CRect rect; //rect.CopyRect(&lpDIS->rcItem); m_state = NORMAL; if (state & ODS_FOCUS) { if (state & ODS_SELECTED) { m_state = DOWN; } else { if(m_bMouseOver) m_state = HOVER; } } else { m_state = NORMAL; } if (state & ODS_DISABLED) { m_state = DISABLE; m_bEnabled = false; } DrawButton(); } void CSkinBtn::DrawButton() { CClientDC dc(this); CRect rect; GetClientRect(&rect); CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap Screen; Screen.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height()); memDC.SelectObject(&Screen); Screen.DeleteObject(); //画背景 memDC.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &m_memDC, 0, 0, SRCCOPY); CString str; GetWindowText(str); memDC.SetBkMode(TRANSPARENT); memDC.SelectObject(m_pFont); switch(m_state) { case NORMAL: // //memDC.TextOutW(m_textPos.x,m_textPos.y,str); if(!m_imgNormal.IsNull()) m_imgNormal.TransparentBlt(memDC, rect.left, rect.top, m_imgNormal.GetWidth(), m_imgNormal.GetHeight(), RGB(255,0,255)); if(!m_hMouseOutIcon.IsNull()) { m_hMouseOutIcon.TransparentBlt(memDC, m_iconRect.left,m_iconRect.top, m_iconRect.Width(), m_iconRect.Height(), RGB(0,0,0)); memDC.SetTextColor(GetFGColor()); memDC.TextOutW(m_textPos.x,m_textPos.y,str); } //DrawButtonText(&dc, rect, str, GetFGColor()); break; case HOVER: //DrawFilledRect(&memDC, rect, RGB(255,255,0)); if(!m_imgHover.IsNull()) m_imgHover.TransparentBlt(memDC, rect.left, rect.top, m_imgHover.GetWidth(), m_imgHover.GetHeight(), RGB(255,0,255)); if(!m_hMouseInIcon.IsNull()) { m_hMouseInIcon.TransparentBlt(memDC, m_iconRect.left,m_iconRect.top, m_iconRect.Width(), m_iconRect.Height(), RGB(0,0,0)); memDC.SetTextColor(GetBGColor()); memDC.TextOutW(m_textPos.x,m_textPos.y,str); } //DrawButtonText(&dc, rect, str, GetFGColor()); break; case DOWN: //DrawFilledRect(&memDC, rect, RGB(0,0,255)); if(!m_imgDown.IsNull()) m_imgDown.TransparentBlt(memDC, rect.left, rect.top, m_imgDown.GetWidth(), m_imgHover.GetHeight(), RGB(255,0,255)); if(!m_hMouseOutIcon.IsNull()) { m_hMouseOutIcon.TransparentBlt(memDC, m_iconRect.left+1,m_iconRect.top+1, m_iconRect.Width(), m_iconRect.Height(), RGB(0,0,0)); memDC.SetTextColor(GetBGColor()); memDC.TextOutW(m_textPos.x+1,m_textPos.y+1,str); } //DrawButtonText(&dc, rect, str, GetFGColor()); break; case DISABLE: if(!m_imgDisable.IsNull()) m_imgDisable.TransparentBlt(memDC, rect.left, rect.top, m_imgDisable.GetWidth(), m_imgHover.GetHeight(), RGB(255,0,255)); if(!m_hMouseOutIcon.IsNull()) { m_hMouseOutIcon.TransparentBlt(memDC, m_iconRect.left,m_iconRect.top, m_iconRect.Width(), m_iconRect.Height(), RGB(0,0,0)); memDC.SetTextColor(GetFGColor()); memDC.TextOutW(m_textPos.x,m_textPos.y,str); } //DrawButtonText(&dc, rect, str, RGB(128, 128, 128)); break; default: break; } dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY); memDC.DeleteDC(); } void CSkinBtn::DrawFilledRect(CDC *DC, CRect R, COLORREF color) { CBrush B; B.CreateSolidBrush(color); DC->FillRect(R, &B); } void CSkinBtn::DrawButtonText(CDC *DC, CRect R, CString str, COLORREF TextColor) { COLORREF prevColor = DC->SetTextColor(TextColor); DC->SetBkMode(TRANSPARENT); DC->SelectObject(m_pFont); if(m_hMouseOutIcon.IsNull()&&m_hMouseInIcon.IsNull()) { //int iconwidth=::GetSystemMetrics(SM_CXICON); R.right=R.right-m_textPos.x; DC->DrawText( str, str.GetLength(), R, DT_CENTER|DT_VCENTER|DT_SINGLELINE); } else { DC->DrawText( str, str.GetLength(), R, DT_RIGHT|DT_VCENTER|DT_SINGLELINE); } DC->SetTextColor(prevColor); } void CSkinBtn::OnMouseMove(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 //if (nFlags & MK_LBUTTON && m_bMouseOver == FALSE) // return; if(!m_bMouseOver&&m_bEnabled) { m_bMouseOver=true; m_state = HOVER; CPoint point; CRect rect; GetWindowRect(&rect); GetCursorPos(&point); if (!rect.PtInRect(point) && m_bMouseOver&&m_bEnabled) { SetTimer(1,10,NULL); return; } DrawButton(); SetTimer(1,10,NULL); } CButton::OnMouseMove(nFlags, point); } void CSkinBtn::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CPoint point; CRect rect; GetWindowRect(&rect); GetCursorPos(&point); if (!rect.PtInRect(point) && m_bMouseOver&&m_bEnabled) { KillTimer (1); m_bMouseOver=false; m_state = NORMAL; DrawButton(); } CButton::OnTimer(nIDEvent); } void CSkinBtn::PreSubclassWindow() { // TODO: 在此添加专用代码和/或调用基类 SetOwnerDraw(true); CButton::PreSubclassWindow(); } void CSkinBtn::SetOwnerDraw(bool IsDraw) { if(IsDraw) { ModifyStyle(NULL, BS_OWNERDRAW); Invalidate(); } else { ModifyStyle(BS_OWNERDRAW, NULL); Invalidate(); } } void CSkinBtn::SetImage(CString strNormal, CString strHover, CString strDown, CString strDisable) { m_imgNormal.Load(strNormal); m_imgHover.Load(strHover); m_imgDown.Load(strDown); m_imgDisable.Load(strDisable); } void CSkinBtn::SetImage(UINT nNormalID, UINT nHoverID, UINT nDownID, UINT nDisableID) { m_imgNormal.LoadFromResource(AfxGetApp()->m_hInstance, nNormalID ); m_imgHover.LoadFromResource(AfxGetApp()->m_hInstance, nHoverID ); m_imgDown.LoadFromResource(AfxGetApp()->m_hInstance, nDownID ); m_imgDisable.LoadFromResource(::GetModuleHandle(NULL), nDisableID ); } BOOL CSkinBtn::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if(!m_bDCStored) { CRect rect; GetClientRect(&rect); m_memDC.CreateCompatibleDC (pDC); CBitmap btScreen; btScreen.CreateCompatibleBitmap (pDC,rect.Width(),rect.Height()); m_memDC.SelectObject (&btScreen); m_memDC.BitBlt (0,0,rect.Width(),rect.Height(),pDC,0,0,SRCCOPY); m_bDCStored=true; CRgn rgn; rgn.CreateRectRgn (0, 0, rect.Width(), rect.Height()); SetWindowRgn (rgn, TRUE); btScreen.DeleteObject(); } return TRUE;// CButton::OnEraseBkgnd(pDC);// } BOOL CSkinBtn::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { // TODO: 在此添加消息处理程序代码和/或调用默认值 ::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_HAND)); return TRUE; return CButton::OnSetCursor(pWnd, nHitTest, message); } void CSkinBtn::SetIcon(CString strMouseOut,CString strMouseIn) { m_hMouseOutIcon.Load(strMouseOut); m_hMouseInIcon.Load(strMouseIn); } void CSkinBtn::SetColor(COLORREF fgcolor,COLORREF bgcolor) { m_fg = fgcolor; m_bg = bgcolor; DrawButton(); } void CSkinBtn::SetTextPos(CPoint point) { m_textPos = point; DrawButton(); } CRect CSkinBtn::GetRectInParent() { CRect rcWindowParent; GetParent()->GetWindowRect(rcWindowParent);//client CRect rcWindow; GetWindowRect(&rcWindow); CRect rect; rect.left = rcWindow.left-rcWindowParent.left; rect.top = rcWindow.top-rcWindowParent.top; rect.right = rcWindow.right-rcWindowParent.left; rect.bottom = rcWindow.bottom-rcWindowParent.top; return rect; } void CSkinBtn::OnEnable(BOOL bEnable) { CButton::OnEnable(bEnable); // TODO: 在此处添加消息处理程序代码 if(bEnable) m_bEnabled = true; else m_bEnabled = false; }